/**
 * MIT License
 * 
 * Copyright (c) 2024 - present @ ebraid
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */


#ifndef __EB_CTYPE_H
#define __EB_CTYPE_H


#define _U	0x01	/* upper */
#define _L	0x02	/* lower */
#define _D	0x04	/* digit */
#define _C	0x08	/* cntrl */
#define _P	0x10	/* punct */
#define _S	0x20	/* white space (space/lf/tab) */
#define _X	0x40	/* hex digit */
#define _SP	0x80	/* hard space (0x20) */


extern const unsigned char ctype[];


#define __ismask(x)     (ctype[(int)(unsigned char)(x)])

#define isalnum(c)	    ((__ismask(c)&(_U|_L|_D)) != 0)
#define isalpha(c)	    ((__ismask(c)&(_U|_L)) != 0)
#define iscntrl(c)	    ((__ismask(c)&(_C)) != 0)
#define isgraph(c)	    ((__ismask(c)&(_P|_U|_L|_D)) != 0)
#define islower(c)	    ((__ismask(c)&(_L)) != 0)
#define isprint(c)	    ((__ismask(c)&(_P|_U|_L|_D|_SP)) != 0)
#define ispunct(c)	    ((__ismask(c)&(_P)) != 0)
/* Note: isspace() must return false for %NUL-terminator */
#define isspace(c)	    ((__ismask(c)&(_S)) != 0)
#define isupper(c)	    ((__ismask(c)&(_U)) != 0)
#define isxdigit(c)	    ((__ismask(c)&(_D|_X)) != 0)

#define isascii(c)      (((unsigned char)(c))<=0x7f)
#define toascii(c)      (((unsigned char)(c))&0x7f)


#endif // __EB_CTYPE_H
